package flare.physics
{
  /**
   * Force simulating a global gravitational pull on Particle instances.
   */
  public class GravityForce implements IForce
  {
    private var _gx:Number;
    private var _gy:Number;

    /** The gravitational acceleration in the horizontal dimension. */
    public function get gravityX():Number
    {
      return _gx;
    }

    public function set gravityX(gx:Number):void
    {
      _gx = gx;
    }

    /** The gravitational acceleration in the vertical dimension. */
    public function get gravityY():Number
    {
      return _gy;
    }

    public function set gravityY(gy:Number):void
    {
      _gy = gy;
    }

    /**
     * Creates a new gravity force with given acceleration values.
     * @param gx the gravitational acceleration in the horizontal dimension
     * @param gy the gravitational acceleration in the vertical dimension
     */
    public function GravityForce(gx:Number = 0, gy:Number = 0)
    {
      _gx = gx;
      _gy = gy;
    }

    /**
     * Applies this force to a simulation.
     * @param sim the Simulation to apply the force to
     */
    public function apply(sim:Simulation):void
    {
      if(_gx == 0 && _gy == 0)return;

      var p:Particle;

      for(var i:uint = 0; i < sim.particles.length; ++i)
      {
        p = sim.particles[i];
        p.fx += _gx * p.mass;
        p.fy += _gy * p.mass;
      }
    }
  } // end of class GravityForce
}